from appium.webdriver.common.appiumby import AppiumBy
from base.base_page import BasePage  # 需根据实际项目导入 BasePage 所在模块
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


import time
from datetime import datetime


class FilterPage(BasePage):
    # 页面标题
    PAGE_TITLE = (AppiumBy.XPATH, "//android.widget.TextView[@text='筛选']")
    # 返回按钮（左上角箭头）
    BACK_BUTTON = (
    AppiumBy.XPATH, "//android.widget.ImageView[@resource-id='...' and @content-desc='返回']")  # 补充准确 resource-id

    # 寄件日期选择框（整体容器，点击展开日期选择器）
    SHIPMENT_DATE_PICKER = (AppiumBy.XPATH,
                            "//android.widget.LinearLayout[@resource-id='...' and contains(@content-desc,'寄件日期')]")  # 补充准确 resource-id
    # 寄件日期 - 开始日期输入框
    SHIPMENT_START_DATE = (AppiumBy.XPATH, "//android.widget.EditText[@hint='2025/05/02']")
    # 寄件日期 - 结束日期输入框
    SHIPMENT_END_DATE = (AppiumBy.XPATH, "//android.widget.EditText[@hint='2025/06/30']")

    # 签收日期选择框（整体容器，点击展开日期选择器）
    RECEIPT_DATE_PICKER = (AppiumBy.XPATH,
                           "//android.widget.LinearLayout[@resource-id='...' and contains(@content-desc='签收日期')]")  # 补充准确 resource-id
    # 签收日期 - 开始日期输入框
    RECEIPT_START_DATE = (AppiumBy.XPATH, "//android.widget.EditText[@hint='开始日期']")
    # 签收日期 - 结束日期输入框
    RECEIPT_END_DATE = (AppiumBy.XPATH, "//android.widget.EditText[@hint='结束日期']")

    # 付款方式 - 全部（默认选中，可用于断言或重置）
    PAYMENT_ALL = (AppiumBy.XPATH, "//android.widget.TextView[@text='全部' and @resource-id='...']")  # 补充准确 resource-id
    # 付款方式 - 寄方付月结
    PAYMENT_SENDER_MONTHLY = (AppiumBy.XPATH, "//android.widget.TextView[@text='寄方付月结']")
    # 付款方式 - 寄方付现结
    PAYMENT_SENDER_CASH = (AppiumBy.XPATH, "//android.widget.TextView[@text='寄方付现结']")
    # 付款方式 - 收方付
    PAYMENT_RECEIVER = (AppiumBy.XPATH, "//android.widget.TextView[@text='收方付']")
    # 付款方式 - 第三方付
    PAYMENT_THIRD_PARTY = (AppiumBy.XPATH, "//android.widget.TextView[@text='第三方付']")

    # 付款公司输入框
    PAYMENT_COMPANY_INPUT = (AppiumBy.XPATH, "//android.widget.EditText[@hint='请输入付款公司名称']")

    # 重置按钮
    RESET_BUTTON = (AppiumBy.XPATH, "//android.widget.TextView[@text='重置']")
    # 确定按钮
    CONFIRM_BUTTON = (AppiumBy.XPATH, "//android.widget.TextView[@text='确定']")

    # ---------------------- 操作方法 ----------------------
    def click_back(self):
        """点击返回按钮，回到上一级页面（查件页）"""
        self.click(self.BACK_BUTTON)



    def open_shipment_date_picker(self):
        """点击寄件日期选择框，展开日期选择器（需配合日期选择逻辑，这里仅触发展开）"""
        self.click(self.SHIPMENT_DATE_PICKER)

    def select_shipment_date(self, start_date, end_date):
        """
        选择寄件日期范围，使用 ActionChains 处理滑动，适配新版 Selenium（无 TouchAction）
        :param start_date: 起始日期，格式如 "2025/05/08"
        :param end_date: 结束日期，格式如 "2025/05/15"
        """
        # 将日期字符串转换为 datetime 对象，方便处理
        start_dt = datetime.strptime(start_date, "%Y/%m/%d")
        end_dt = datetime.strptime(end_date, "%Y/%m/%d")

        # 点击寄件日期选择框，触发日期选择组件弹出（需替换为实际项目的定位方式）
        shipment_date_picker = WebDriverWait(self.driver, 10).until(
            EC.element_to_be_clickable((By.XPATH, "//*[contains(@text, '寄件日期')]/parent::*"))
        )
        shipment_date_picker.click()
        time.sleep(1)  # 等待日期组件弹出

        # 处理快捷选择（可根据实际需求扩展，这里先跳过，优先手动选日期）

        # 手动选择起始日期：先切换到起始日期所在月份
        self._switch_to_target_month(start_dt)
        # 点击起始日期对应的天数（需替换为实际可定位到天数的 XPATH，示例写法，根据 App 调整）
        start_day_elem = WebDriverWait(self.driver, 5).until(
            EC.element_to_be_clickable((By.XPATH, f"//*[@text='{start_dt.day}' and not(contains(@text, '开始'))]"))
        )
        start_day_elem.click()
        time.sleep(0.5)

        # 手动选择结束日期：切换到结束日期所在月份
        self._switch_to_target_month(end_dt)
        # 点击结束日期对应的天数（需替换为实际可定位到天数的 XPATH，示例写法，根据 App 调整）
        end_day_elem = WebDriverWait(self.driver, 5).until(
            EC.element_to_be_clickable((By.XPATH, f"//*[@text='{end_dt.day}' and not(contains(@text, '结束'))]"))
        )
        end_day_elem.click()
        time.sleep(0.5)

        # 点击确定按钮，确认日期选择（需替换为实际项目的定位方式）
        confirm_btn = WebDriverWait(self.driver, 5).until(
            EC.element_to_be_clickable((By.XPATH, "//*[@text='确定']"))
        )
        confirm_btn.click()
        time.sleep(1)  # 等待组件关闭、页面刷新

    def _switch_to_target_month(self, target_dt):
        """
        滑动切换到目标日期所在的月份
        :param target_dt: datetime 对象，包含目标月份信息
        """
        target_month_year = target_dt.strftime("%Y年%m月")
        # 获取当前显示的月份（需替换为实际可定位到月份文本的 XPATH，示例写法）
        current_month_elem = WebDriverWait(self.driver, 5).until(
            EC.visibility_of_element_located((By.XPATH,
                                              "//*[@class='android.widget.TextView' and @text!='日' and @text!='一' and @text!='二' and @text!='三' and @text!='四' and @text!='五' and @text!='六']"))
        )
        current_month_year = current_month_elem.text

        # 如果当前月份不是目标月份，循环滑动切换
        while current_month_year != target_month_year:
            # 找到可滑动的容器（需替换为实际可滑动区域的 XPATH，比如日期选择器的滚动容器）
            swipe_container = WebDriverWait(self.driver, 5).until(
                EC.visibility_of_element_located((By.XPATH, "//*[@class='android.widget.NumberPicker']"))
            )
            # 获取滑动容器的尺寸
            container_size = swipe_container.size
            # 模拟向上滑动（减少 y 坐标，值越大滑动幅度越大，可根据实际调整）
            actions = ActionChains(self.driver)
            actions.w3c_actions.pointer_action.move_to(swipe_container)
            actions.w3c_actions.pointer_action.pointer_down()
            actions.w3c_actions.pointer_action.move_by(x=0, y=-container_size['height'] / 2)  # 向上滑半屏
            actions.w3c_actions.pointer_action.pointer_up()
            actions.perform()

            time.sleep(0.5)
            # 更新当前显示的月份
            current_month_year = current_month_elem.text

    def input_shipment_start_date(self, date):
        """
        输入寄件开始日期
        :param date: 日期内容，如 "2025/05/01"
        """
        self.send_keys(self.SHIPMENT_START_DATE, date)

    def input_shipment_end_date(self, date):
        """
        输入寄件结束日期
        :param date: 日期内容，如 "2025/06/30"
        """
        self.send_keys(self.SHIPMENT_END_DATE, date)

    def open_receipt_date_picker(self):
        """点击签收日期选择框，展开日期选择器（需配合日期选择逻辑，这里仅触发展开）"""
        self.click(self.RECEIPT_DATE_PICKER)

    def input_receipt_start_date(self, date):
        """
        输入签收开始日期
        :param date: 日期内容，如 "2025/05/02"
        """
        self.send_keys(self.RECEIPT_START_DATE, date)

    def input_receipt_end_date(self, date):
        """
        输入签收结束日期
        :param date: 日期内容，如 "2025/06/30"
        """
        self.send_keys(self.RECEIPT_END_DATE, date)

    def select_payment_sender_monthly(self):
        """选择付款方式：寄方付月结"""
        self.click(self.PAYMENT_SENDER_MONTHLY)

    def select_payment_sender_cash(self):
        """选择付款方式：寄方付现结"""
        self.click(self.PAYMENT_SENDER_CASH)

    def select_payment_method(self, method):
        """选择付款方式"""
        self.click((AppiumBy.XPATH, f"//android.widget.TextView[@text='{method}']"))



    def select_payment_third_party(self):
        """选择付款方式：第三方付"""
        self.click(self.PAYMENT_THIRD_PARTY)

    def input_payment_company(self, company_name):
        """
        输入付款公司名称
        :param company_name: 公司名称，如 "XX科技有限公司"
        """
        self.send_keys(self.PAYMENT_COMPANY_INPUT, company_name)

    def click_reset(self):
        """点击重置按钮，清空筛选条件"""
        self.click(self.RESET_BUTTON)

    def click_confirm(self):
        """点击确定按钮，应用筛选条件并返回查件页"""
        self.click(self.CONFIRM_BUTTON)

    def is_filters_reset(self):
        """验证筛选条件是否重置（示例：检查付款方式是否为“全部”，日期是否恢复默认）"""
        # 检查付款方式是否为“全部”
        all_payment = self.is_element_exist(
            (AppiumBy.XPATH, "//android.widget.TextView[@text='全部' and @selected='true']"))
        # 检查日期是否恢复默认（需根据实际默认值调整）
        default_start_date = "2025/05/03"  # 假设默认值，需确认
        default_end_date = "2025/07/01"  # 假设默认值，需确认
        current_start_date = self.driver.find_element(AppiumBy.XPATH, "//android.widget.EditText[1]").text
        current_end_date = self.driver.find_element(AppiumBy.XPATH, "//android.widget.EditText[2]").text
        return all_payment and current_start_date == default_start_date and current_end_date == default_end_date


